package day0605;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.ByteChannel;
import java.nio.channels.FileChannel;
import java.util.RandomAccess;

/**
 * 下面是一个使用FileChannel读取数据到Buffer中的示例：
 * 注意 buf.flip() 的调用，首先读取数据到Buffer，然后反转Buffer,接着再从Buffer中读取数据。
 * Created by Administrator on 2017/6/5.
 */
public class JChannelDemo3 {
    public static void main(String[] args) throws Exception {
        RandomAccessFile aFile = new RandomAccessFile("C:\\Users\\Administrator\\Desktop\\111.txt", "rw"); //实例化文件对象
        FileChannel inChannel = aFile.getChannel(); //返回给对象通道,创建一个通道？
        ByteBuffer buf = ByteBuffer.allocate(100); //创建byte缓存
        int bytesRead = inChannel.read(buf); //给予文件对象缓存空间,如果读取的通道对象大于给予的缓存空间，则会分批多次读取
        while (bytesRead != -1) { //判断是否读取完毕
            System.out.println("Read " + bytesRead);
            buf.flip(); //相当于重新读取
            while (buf.hasRemaining()) { //判断是否读取完毕
                System.out.println((char) buf.get()); //在缓存内一个一个读取
            }
            //clear()方法会清空整个缓冲区
//            buf.clear(); //如果不清空，则原有数据无法清除，所以后面的数据就不会在进来,一旦读完了所有的数据，就需要清空缓冲区，让它可以再次被写入
            //compact()方法只会清除已经读过的数据。任何未读的数据都被移到缓冲区的起始处，新写入的数据将放到缓冲区未读数据的后面。
            buf.compact();
            bytesRead = inChannel.read(buf); //重新赋值给对象空间
        }
        aFile.close();
    }
}
